/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sofia.Persistencia.Managers;

import Principal.MainSofia;
import java.util.List;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;
import sofia.LogicaNegocio.Fisioterapeuta;
import sofia.Persistencia.Entidades.EFisioterapeuta;

/**
 *
 * @author crisfalt
 */
public class MFisioterapeuta {

        @PersistenceUnit
        private EntityManagerFactory managerFactory;
        private EntityManager entityManager;

        public MFisioterapeuta() {
                managerFactory = MainSofia.managerFactory;
                entityManager = managerFactory.createEntityManager();
        }

        //agrege algo
        /**
        * Este metodo se encarga de la persistencia en la entidad Informe
        * de un objeto Informe.
        *
         * @param objFisioterapeuta
         * @param idJefe 
         * @throws RollbackException 
         * @throws EntityExistsException
         */
        public void crearFisioterapeuta( final Fisioterapeuta objFisioterapeuta , final String idJefe ) throws RollbackException, EntityExistsException {
                entityManager.clear();
                EFisioterapeuta entidadFisioterapeuta = new EFisioterapeuta();
                entidadFisioterapeuta.setIdLogin( objFisioterapeuta.getLogin() );
                entidadFisioterapeuta.setNombre( objFisioterapeuta.getNombre() );
                entidadFisioterapeuta.setCedula( objFisioterapeuta.getCedula() );
                entidadFisioterapeuta.setTelefono( objFisioterapeuta.getTelefono() );
                entidadFisioterapeuta.setEmail( objFisioterapeuta.getEmail() );
                EFisioterapeuta entidadCoordinador = entityManager.find( EFisioterapeuta.class , idJefe );
                entidadFisioterapeuta.setIdLoginJefe( entidadCoordinador.getIdLogin() );

                //persiste el objeto en la entidad
                EntityTransaction transaccion = entityManager.getTransaction();
                try {
                        transaccion.begin();
                        entityManager.persist( entidadFisioterapeuta );
                }
                catch (EntityExistsException ex) {
                        throw ex;
                }
                finally {
                        transaccion.commit();
                }
                entityManager.clear();
        }

        // actualiza datos 
        public void actualizarFisioterapeuta( final String id_login , final Fisioterapeuta fisioterapeuta , final String nuevoJefe ) {
                entityManager.clear();
                EFisioterapeuta entidadFisioterapeuta;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadFisioterapeuta = entityManager.find( EFisioterapeuta.class , id_login );
                transaccion.commit();
                if( entidadFisioterapeuta != null ) {
//                        la llave es unica no puede ser cambiada
//                        entidadFisioterapeuta.setIdLogin( fisioterapeuta.getLogin() );
                        entidadFisioterapeuta.setNombre( fisioterapeuta.getNombre() );
                        entidadFisioterapeuta.setCedula( fisioterapeuta.getCedula() );
                        entidadFisioterapeuta.setTelefono( fisioterapeuta.getTelefono() );
                        entidadFisioterapeuta.setEmail( fisioterapeuta.getEmail() );
                        EFisioterapeuta entidadCoordinador = entityManager.find( EFisioterapeuta.class , nuevoJefe );
                        entidadFisioterapeuta.setIdLoginJefe( entidadCoordinador.getIdLogin() );
//                        cuando hace cambio de jefe tambn tok actualizar a la relacion coordinacion con lo DAOS
//                        en el metodo actualizarCambioCoordinador

                        transaccion.begin();
                        entityManager.merge( entidadFisioterapeuta );
                        transaccion.commit();
                }
                entityManager.clear();
        }

        public void eliminarFisioterapeuta( final int idFisio ) {
                entityManager.clear();
                EFisioterapeuta entidadFisioterapeuta;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadFisioterapeuta = entityManager.find( EFisioterapeuta.class , idFisio );
                entityManager.remove( entidadFisioterapeuta );
                transaccion.commit();
                entityManager.clear();
        }

        public Fisioterapeuta obtenerFisioterapeuta( final String idLogin ) {
                entityManager.clear();
                EFisioterapeuta entidadFisioterapeuta;
                Fisioterapeuta fisioterapueta = null;
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                entidadFisioterapeuta = entityManager.find( EFisioterapeuta.class , idLogin );
                transaccion.commit();
                if( entidadFisioterapeuta != null ) {
                        fisioterapueta = new Fisioterapeuta();
                        fisioterapueta.setCedula( entidadFisioterapeuta.getCedula() );
                        fisioterapueta.setEmail( entidadFisioterapeuta.getEmail() );
                        fisioterapueta.setNombre( entidadFisioterapeuta.getNombre() );
                        fisioterapueta.setTelefono( entidadFisioterapeuta.getTelefono() );
                        fisioterapueta.setLogin( entidadFisioterapeuta.getIdLogin() );
                        fisioterapueta.setLoginJefe( entidadFisioterapeuta.getIdLoginJefe() );
                }
                entityManager.clear();
                return fisioterapueta;
        }

        public List obtenerFisioterapeutasRegistrados() {
                entityManager.clear();
                EntityTransaction transaccion = entityManager.getTransaction();
                transaccion.begin();
                List fisioterapeutas = null;
                Query query = entityManager.createQuery( "SELECT eFisioterapeuta FROM EFisioterapeuta eFisioterapeuta" );
                fisioterapeutas = query.getResultList();
                transaccion.commit();
                if( !fisioterapeutas.isEmpty() ) {
                        System.out.println( "Leyendo " + fisioterapeutas.size() + " Fisioterapeutas" );
//                        Iterator stIterator = fisioterapeutas.iterator();
//                        while( stIterator.hasNext() ){
//                                EFisioterapeuta entidadFisioterapeuta = (EFisioterapeuta)stIterator.next();
//                                System.out.println( "id " + entidadFisioterapeuta.getIdLogin() );
//                        }
                }
                entityManager.clear();
                return fisioterapeutas;
        }
        
}
